/*
如果数组去重，涉及到对象引用问题，应该怎么解决？
 */
let a = {"a": 1};
let b = {"a": 1};
let c = {"b": 2};
let nums = [a, b, c];
// 预计结果： [{"a": 1}, {"b": 2}]


//? 解决方案：详见“判断两个对象是否相等”里的函数可以判断. 这里就用循环来两两判断咯

//? 也可以参考以下代码
/**
 * @description: 检查两个对象 obj1 和 obj2 是否值相等
 * @param {*} obj1
 * @param {*} obj2
 * @return {*}
 */
function checkObj(obj1, obj2) {
    if (typeof obj1 !== typeof obj2) return false
    if (Object.keys(obj1).length !== Object.keys(obj2).length) {
        return false
    }
    for (let o in obj1) {
        const t1 = obj1[o] instanceof Object
        const t2 = obj2[o] instanceof Object
        if (t1 && t2) {
            const res = checkObj(obj1[o],obj2[o])
            if (res === false) return false
        }
        else {
            if (obj1[o] !== obj2[o]) return false
        }
    }
    return true
}

/**
 * @description: 在数组原型上写方法
 * @param {*} itemObj
 * @return {*}
 */
Array.prototype.includesObj = function (itemObj) {
    let flag = false
    for (let i = 0; i < this.length; i ++) {
        if (checkObj(this[i],itemObj)) {
            flag = true;
            break;
        }
    }
    return flag
};

/**
 * @description: 针对对象数组，且可能出现对象引用的问题
 * @param {*} nums
 * @return {*}
 */
function uniqSpecial(nums) {
    const result = [];
    for (let i = 0; i < nums.length; i ++) {
        if (!result.includesObj(nums[i])) result.push(nums[i])
    }
    return result
}


console.log(uniqSpecial(nums));
// [ { a: 1 }, { b: 2 } ]


//? 条件简单版 只需要判断id是否相同
const responseList = [
    { id: 1, a: 1 },
    { id: 2, a: 2 },
    { id: 3, a: 3 },
    { id: 1, a: 4 },
];
const result = responseList.reduce((acc, cur) => {
    const ids = acc.map(item => item.id);
    return ids.includes(cur.id) ? acc : [...acc, cur];
}, []);
console.log(result); // -> [ { id: 1, a: 1}, {id: 2, a: 2}, {id: 3, a: 3} ]
